import pandas as pd


df =pd.read_excel('1.xlsx')

import numpy as np  # 导入 numpy 用于 NaN 值的处理

# 设定全局变量 null，代表 NaN 值
null = np.nan

'''
def dict_data_extract(all_data: pd.DataFrame, dictionary_field: list):
    global null

    # 处理每一个需要展开的字典格式的列
    for field in dictionary_field:
        # 使用 eval() 函数解析列中的字典，并将其转换为新列
        all_data[field] = all_data[field].apply(lambda x: eval(x) if pd.notna(x) else null)
        # 将展开后全部为 null 的列删除
        all_data.dropna(axis=1, how='all', inplace=True)

    return all_data

dictionary_field = ['related_product']
processed_data = dict_data_extract(df, dictionary_field)
'''

# 将空值替换为0
df.iloc[:, 58:61] = df.iloc[:, 58:61].fillna(0)

# 计算点击率列
df['点击率'] = df.apply(lambda row: 0 if row.iloc[58] == 0 else row.iloc[59] / row.iloc[58], axis=1)

# 计算转化率列
df['转化率'] = df.apply(lambda row: 0 if row.iloc[59] == 0 else row.iloc[60] / row.iloc[59], axis=1)

columns_to_encode = [4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 18, 19, 20, 25, 32, 33, 34, 39, 43, 49, 50, 63]  # 注意索引从0开始

# 使用 pandas 的 get_dummies 函数进行独热编码
# drop_first=True 可以设置是否删除第一列，避免多重共线性
df_encoded = pd.get_dummies(df, columns=df.columns[columns_to_encode], drop_first=True)


df_encoded.to_excel('processed_data.xlsx', index=False)

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 假设 X 是你的独热编码特征，y 是点击率或转化率的实际值
# X 的形状应为 (样本数, 特征数)，y 的形状为 (样本数,)
# 这里假设 X 和 y 是从你的数据中提取的

# 将空值替换为0
df_encoded.iloc[:, [28, 37]] = df.iloc[:, [28, 37]].fillna(0)

'''
import json

# 假设 df 是你的数据集，29列和38列是包含JSON字符串的列
# 假设列索引从0开始

def convert_json_to_float(json_str):
    try:
        data = json.loads(json_str)
        # 假设你的JSON字符串中有一个名为 'value' 的字段
        value = data.get('value', 0)  # 默认为0，或者根据实际情况设定默认值
        return float(value)
    except (json.JSONDecodeError, TypeError, ValueError):
        return float('NaN')  # 转换失败时返回NaN，或者适合的默认值

# 选择需要转换的列，假设29列和38列
cols_to_convert = [29, 38]

for col_idx in cols_to_convert:
    df_encoded.iloc[:, col_idx] = df_encoded.iloc[:, col_idx].apply(convert_json_to_float)
'''
# 选择特征列和目标列
X = df_encoded.iloc[:, list(range(44, 71)) ]      # 第45列到第72列，Python中索引是从0开始的，所以第45列对应索引为44
y = df_encoded.iloc[:, 43]     # 第44列，对应索引为43

# 确认数据选择是否正确
print("Features (X):")
print(X.head())
print("\nTarget (y):")
print(y.head())

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化随机森林回归模型
rf_reg = RandomForestRegressor(n_estimators=100, random_state=42)

# 训练模型
rf_reg.fit(X_train, y_train)

# 预测测试集上的点击率或转化率
y_pred = rf_reg.predict(X_test)

# 评估模型，这里以均方误差（Mean Squared Error，MSE）为例
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")



